// Synchronization.h

// Tu sa rozhoduje, kedy sa ma vykonat akcia

#ifndef SYNCHRONIZATION_H
#define SYNCHRONIZATION_H

#include "Common/Interfaces/Interface.h"
#include "Common/Protocol/ParseStructs.h"
#include "Common/World/ParamStructs.h"

// Synchronizacne mody
enum SynchroMode
{
	Synch_Normal,				// Po SenseBody
	Synch_WaitForVI,			// Po vizualnej informacii
	Synch_VIOnly				// Iba po vizualnej informacii
};

// Synchronizacny interfejs - rozhoduje o nacasovani akcii
class SynchronizationInterface : public Interface
{
public:
	// Konstruktor
	SynchronizationInterface() : Interface("Synchronizacny interfejs", "v0.02")
	{
	
	}
	// Destruktor
	virtual ~SynchronizationInterface()
	{
	
	}
	// METODY
	
	//-------------------------------------------------------------
	// Nasledujuce funkcie sa volaju po obdrzani spravy

	// Handler pre zmenu modu (sprava rozhodcu)
	virtual void OnChangeMode(int time, PlayMode mode) = 0;

	// Handler pre zmenu typu hraca
	virtual void OnChangePlayerType(int uniform, int iType) = 0;

	// Handler pre vnimanie zvuku
	virtual void OnHear(int time, float direction, bool ourTeam, int uniform, const char* msg) = 0;

	// Handler pre prvu spravu po pripojeni sa k serveru
	virtual void OnInit(RealSide realSide, int uniform, PlayMode mode) = 0;

	// Handler pre informacie o heterogennych typoch hracov
	virtual void OnPlayerParam(const PLAYER_PARAMS* params) = 0;

	// Handler pre informacie o jednom heterogennom (alebo normalnom) type hraca
	virtual void OnPlayerType(int id, const PLAYER_TYPE* type) = 0;

	// Handler pre informaciu o skore
	virtual void OnScore(int time, int our, int their) = 0;

	// Handler pre zrakove spravy
	virtual void OnSee(const VISUAL_INFO*) = 0;

	// Handler pre spravy SenseBody
	virtual void OnSenseBody(const SENSE_BODY*) = 0;

	// Handler pre zmenu parametrov servera
	virtual void OnServerParam(const SERVER_PARAMS* params) = 0;

//	virtual int OnSendMsg(int, void*) = 0;
//	virtual int OnReceiveMsg(int, void*) = 0;

	//-------------------------------------------------------------
	// Nasledujuce funkcie sa volaju po poslani spravy
	
	virtual void OnExecKick(float fPower, float fDirection) = 0;
	virtual void OnExecTurn(float fMoment) = 0;
	virtual void OnExecDash(float fPower) = 0;
	virtual void OnExecNeck(int iAngle) = 0;
	
	//-------------------------------------------------------------
	
	// Nastavi nasledujuci synchronizacny mod
	virtual void SetNextSynchMode(SynchroMode next) = 0;
	// Vrati nasledujuci synchronizacny mod
	virtual SynchroMode GetNextSynchMode() const = 0;
	// Vrati sucasny synchronizacny mod
	virtual SynchroMode GetCurrentSynchMode() const = 0;

    // Hander pre spravy "freeform"
	virtual void OnFreeform(const char* msg) = 0;
    
//	virtual void OnSetParameterUseNN(const char* msg) = 0;
	
};

#endif // SYNCHRONIZATION_H
